#include "graph.h"
#include<bits/stdc++.h>
using namespace std;
const int N=205;
mt19937 rd(5384);
int rg(int l,int r){return rd()%(r-l+1)+l;}
// void Inspect(int R) {
//     int n=1;
//     vector<int>fid(N),fa(N),d(N),col(N,1),dep(N),st(N),ct(N);
//     vector<vector<int>>e(N,vector<int>(N,1e9)),vis(N);
//     auto add=[&](int x,int y){e[x][y]=e[y][x]=1;};
//     auto dfs=[&](auto&&_,int x,int p)->void {
//         d[x]=NumberOfRoads(),vis[x].resize(d[x]+1);
//         fa[x]=p,fid[x]=LastRoad();
//         if(fid[x]!=-1)vis[x][fid[x]]=1;
//         dep[x]=dep[p]+1,st[dep[x]]=x,e[x][x]=0;
//         while(1) {
//             vector<int>c;for(int i=1;i<=d[x];i++)if(!vis[x][i])c.push_back(i);
//             if(!c.size())break;
//             int to=c[rg(0,c.size()-1)];
//             Move(to,2),vis[x][to]=1;
//             if(Color()==2) {
//                 int las=LastRoad(),nd=dep[x];
//                 Move(las,3);
//                 while(Color()!=3)Move(fid[st[nd--]],2);
//                 add(x,st[nd]),vis[st[nd]][las]=1,Move(las,2);
//             }else add(x,++n),_(_,n,x);
//         }
//         if(~fid[x])Move(fid[x],2);
//     };
//     dfs(dfs,1,0);
//     for(int k=1;k<=n;k++)for(int i=1;i<=n;i++)for(int j=1;j<=n;j++)e[i][j]=min(e[i][j],e[i][k]+e[k][j]);
//     for(int i=1;i<=n;i++)for(int j=i+1;j<=n;j++)ct[e[i][j]]++;
//     for(int i=1;i<=R;i++)Answer(i,ct[i]);
// }
void Inspect(int R) {
    int n=1;
    vector<int>fid(N),fa(N),d(N),col(N,1),dep(N),st(N),ct(N),fr(N);
    vector<vector<int>>e(N,vector<int>(N,1e9)),vis(N);
    auto add=[&](int x,int y){e[x][y]=e[y][x]=1;};
    auto dfs=[&](auto&&_,int x,int p)->void {
        d[x]=NumberOfRoads(),vis[x].resize(d[x]+1);
        fa[x]=p,fid[x]=LastRoad();
        if(fid[x]!=-1)vis[x][fid[x]]=1;
        dep[x]=dep[p]+1,st[dep[x]]=x,e[x][x]=0;
        vector<int>w;
        while(1) {
            vector<int>c;for(int i=1;i<=d[x];i++)if(!vis[x][i])c.push_back(i);
            if(!c.size())break;
            int to=c[rg(0,c.size()-1)];
            Move(to,2),vis[x][to]=1;
            if(Color()==2)Move(LastRoad(),2),w.push_back(to);
            else if(Color()==1)fr[x]=to,add(x,++n),_(_,n,x);
            else Move(LastRoad(),3);
        }
        if(w.size()) {
            for(int i:w)Move(i,2),Move(LastRoad(),1);
            int nd=dep[x],ct=0;
            Move(fid[st[nd--]],3);
            while(1) {
                if(Color()==1)add(x,st[nd]),ct++;
                if(ct==w.size())break;
                Move(fid[st[nd--]],2);
            }
            while(nd+1<dep[x])Move(fr[st[nd++]],2);
        }else if(~fid[x])Move(fid[x],3);
    };
    dfs(dfs,1,0);
    for(int k=1;k<=n;k++)for(int i=1;i<=n;i++)for(int j=1;j<=n;j++)e[i][j]=min(e[i][j],e[i][k]+e[k][j]);
    for(int i=1;i<=n;i++)for(int j=i+1;j<=n;j++)ct[e[i][j]]++;
    for(int i=1;i<=R;i++)Answer(i,ct[i]);
}